perm filename MACRO1.MLI[MLI,LSP] blob sn#166080 filedate 1975-06-30 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN
C00012 ENDMK
C⊗;
BEGIN


% FOR-LOOP EXPANDING AND OPTIMIZING FUNCTIONS %


EXPR ?&FOR1 (L, FN, EX, BE, LISTS);	% THE BASIC WORKHORSE; RETURNS (PROG ...) %
	'PROG CONS
	?&PROGVARS(L, LISTS, FN, EX) CONS
	?&INITS(1, L, LISTS, ?&RPLACA(FN, EX)) @
	'LOOP CONS
	?&TEST(L, ?&TEST1(L, LISTS, 1), FN, EX) CONS
	?&SETS(L, LISTS) @
	?&NEXTS(L, LISTS, 1) @
	?&VAL(FN, EX) @
	(IF BE THEN <<'COND, <BE, ?&RET(FN, EX)>>>) @
	'(GO LOOP) CONS
	IF LENGTH ?&NEWVARS(L) ≠ LENGTH L THEN
		'EXIT CONS ?&RESETS(L, LISTS, 1, CDR L) @ <?&RET(FN, EX)>;


EXPR ?&PROGVARS (L, LISTS, FN, EX);
	(IF ?&RPLACA(FN, EX) THEN '(?&V ?&VV) ELSE '(?&V))
		@ LISTS
		@ ?&RNGES(L, 1)
		@ ?&NEWVARS(L)
		@ IF EX AND NOT(FN EQ 'PROG2 OR FN EQ 'APPEND) THEN
			'(?&NOTFIRST ?&EX);


EXPR ?&RNGES (L, N);
	IF NULL L THEN NIL
	ELSE (IF ?&HOW(L) EQ '?← THEN
		(IF NUMBERP ?&UPPER(L) THEN NIL ELSE <AT("&UPPER" CAT N)>)
		@ (IF NUMBERP ?&INCR(L) THEN NIL
		   ELSE <AT("&INC" CAT N), AT("&POS" CAT N),
			 AT("&NEG" CAT N), AT("&ZERO" CAT N)>))
		@ ?&RNGES(CDR L, N+1);


EXPR ?&NEWVARS (L);
	IF NULL L THEN NIL ELSE
	IF ?&NEW(L) EQ 'NEW THEN ?&VAR(L) CONS ?&NEWVARS(CDR L)
	ELSE ?&NEWVARS(CDR L);


EXPR ?&INITS (N, L, LISTS, R);
	IF NULL L THEN
		IF R THEN '((SETQ ?&V (SETQ ?&VV (LIST NIL))))
		ELSE NIL
	ELSE (	IF ?&HOW(L) EQ '?← THEN ?&INITS1(L, CAR LISTS, N)
		ELSE <<'SETQ, CAR LISTS, ?&LIST(L)>>)
	    @ ?&INITS(N+1, CDR L, CDR LISTS, R);


EXPR ?&INITS1 (L, LST, N);
	<'SETQ, LST, ?&LOWER(L)>
		CONS (	IF NUMBERP ?&UPPER(L) THEN NIL
			ELSE <<'SETQ, AT("&UPPER" CAT N), ?&UPPER(L)>>)
		@ (IF NUMBERP ?&INCR(L) THEN NIL ELSE
			<<'SETQ, AT("&INC" CAT N), ?&INCR(L)>, 
			 <'COND, <<'IGREATERP, AT("&INC" CAT N), 0>,
				  <'SETQ, AT("&POS" CAT N), T>>
			       , <<'ILESSP, AT("&INC" CAT N), 0>,
				  <'SETQ, AT("&NEG" CAT N), T>>
			       , <T, <'SETQ, AT("&ZERO" CAT N), T>> >>);


EXPR ?&TEST (L, TESTS, FN, EX);
	<'COND, <IF CDR TESTS THEN 'OR CONS TESTS ELSE CAR TESTS, 
		 IF LENGTH ?&NEWVARS(L) = LENGTH L THEN ?&RET(FN, EX)
		 ELSE '(GO EXIT)>>;


EXPR ?&TEST1 (L, LISTS, N);
	IF NULL L THEN NIL
	ELSE ?&TEST2(L, CAR LISTS, N) @ ?&TEST1(CDR L, CDR LISTS, N+1);


EXPR ?&TEST2 (L, LST, N);
	IF ?&HOW(L) EQ '?← THEN
		?&TEST3(?&INCR(L), ?&NUM(?&UPPER(L), "&UPPER", N), LST, N)
	ELSE <<'NULL, LST>>;


EXPR ?&TEST3 (INC, UP, LST, N);
	IF NUMBERP INC THEN
		<<IF INC IGREATERP 0 THEN 'IGREATERP ELSE 'ILESSP, LST, UP>>
	ELSE <<'AND, AT("&POS" CAT N), <'IGREATERP, LST, UP>>,
	      <'AND, AT("&NEG" CAT N), <'ILESSP, LST, UP>>, AT("&ZERO" CAT N)>;


EXPR ?&SETS (L, LISTS);
	IF NULL L THEN NIL
	ELSE <'SETQ, ?&VAR(L),
		IF ?&HOW(L) EQ 'IN THEN <'CAR, CAR LISTS> ELSE CAR LISTS>
	    CONS ?&SETS(CDR L, CDR LISTS);


EXPR ?&NEXTS (L, LISTS, N);
	IF NULL L THEN NIL
	ELSE <'SETQ, CAR LISTS,
		IF ?&HOW(L) EQ '?← THEN ?&NEXTS1(?&INCR(L), CAR LISTS, N)
		ELSE <'CDR,CAR LISTS>>
	    CONS ?&NEXTS(CDR L, CDR LISTS, N+1);


EXPR ?&NEXTS1 (INC, LST, N);
	IF INC =  1 THEN <'ADD1, LST> ELSE
	IF INC = -1 THEN <'SUB1, LST>
	ELSE <'PLUS, LST, ?&NUM(INC, "&INC", N)>;


EXPR ?&VAL (FN, EX);
	IF NULL EX THEN NIL
	ELSE IF FN EQ 'PROG2 THEN <<'SETQ, '?&V, EX>>
	ELSE IF ?&RPLACA(FN, EX) THEN <<'NCONC, '?&VV, <'SETQ, '?&VV, EX>>>
	ELSE IF FN EQ 'APPEND THEN <<'SETQ, '?&V, <'APPEND, '?&V, EX>>>
	ELSE <<'SETQ, '?&EX, EX>, 
	      <'SETQ, '?&V, <'COND, <'?&NOTFIRST, <FN, '?&V, '?&EX>>,
			'((SETQ ?&NOTFIRST T) ?&EX)>>>;


EXPR ?&RESETS (L, LISTS, N, MANY);
	IF NULL L THEN NIL
	ELSE (IF ?&NEW(L) EQ 'OLD THEN
			?&RESETS1(?&TEST2(L, CAR LISTS, N), L, MANY))
		@ ?&RESETS(CDR L, CDR LISTS, N+1, MANY);


EXPR ?&RESETS1 (TT, L, MANY);
	IF MANY THEN
		<<'AND, IF CDR TT THEN 'OR CONS TT ELSE CAR TT,
			<'SETQ, ?&VAR(L), NIL>>>
	ELSE <<'SETQ, ?&VAR(L), NIL>>;


EXPR ?&RET (FN, EX);
	IF ?&RPLACA(FN, EX) THEN '(RETURN (CDR ?&V)) ELSE '(RETURN ?&V);


EXPR ?&LISTLST (L, N);
	IF NULL L THEN NIL
	ELSE AT("&L" CAT N) CONS ?&LISTLST(CDR L, N+1);


EXPR ?&NUM (V, X, N);
	IF NUMBERP V THEN V ELSE AT(X CAT N);


EXPR ?&RPLACA (FN, EX);
	FN EQ 'APPEND AND NOT ATOM EX AND EX[1] EQ 'LIST;


EXPR ?&NEW (L);		L[1,1];		% {NEW, OLD} %
EXPR ?&VAR (L);		L[1,2];		% CONTROL VARIABLE %
EXPR ?&HOW (L);		L[1,3];		% {IN, ON, ←} %
EXPR ?&LIST (L);	L[1,4];		% LIST TO BE STEPPED THROUGH %
EXPR ?&LOWER (L);	L[1,4,2];	% LOWER LIMIT FOR NUMERICAL FOR LOOPS %
EXPR ?&UPPER (L);	L[1,4,3];	% UPPER LIMIT FOR NUMERICAL FOR-LOOPS %
EXPR ?&INCR (L);	L[1,4,4];	% INCREMENT FOR NUMERICAL FOR-LOOPS %


EXPR ?&LOOP1 (NAME, FN, EX, BE);	% EXPANDS DO-UNTIL, COLLECT-UNTIL, WHILE-DO. WHILE-COLLECT %
	IF ?&RPLACA(FN, EX) THEN
		'(PROG (?&V ?&VV) (SETQ ?&V (SETQ ?&VV (LIST NIL))) LOOP)
		@	IF NAME EQ '?&DO THEN
				<<'NCONC, '?&VV, <'SETQ, '?&VV, EX>>,
				 <'COND, <BE, '(RETURN (CDR ?&V))>,
					 '(T (GO LOOP))>>
			ELSE	<<'COND, <BE, <'NCONC, '?&VV, <'SETQ, '?&VV, EX>>>,
					 '(T (RETURN (CDR ?&V)))>,
				 '(GO LOOP)>
	ELSE IF (IF FN EQ 'APPEND THEN EX ← <'APPEND, '?&V, EX> ELSE EX) THEN
		'(PROG (?&V) LOOP)
		@	IF NAME EQ '?&DO THEN
				<<'SETQ, '?&V, EX>,
				 <'COND, <BE, '(RETURN ?&V)>, '(T (GO LOOP))>>
			ELSE	<<'COND, <BE, <'SETQ, '?&V, EX>>,
					 '(T (RETURN ?&V))>,
				 '(GO LOOP)>
	ELSE	'(PROG NIL LOOP)
		@	IF NAME EQ '?&DO THEN
				<<'COND, <<'NOT, BE>, '(GO LOOP)>>>
			ELSE	<<'COND, <BE, '(GO LOOP)>>>;


EXPR ?&CARS (X, L, N);			% EXPANDS AND OPTIMIZES INDEX EXPRESSIONS %
	IF NULL L THEN X ELSE
	IF NUMBERP CAR L THEN
		IF N ≤ 3 THEN
			?&CARS(<AT("C" CAT SUBSTR("ADDD",
					IF CAR L + N ≤ 4 THEN 1 ELSE 2,
					IF CAR L + N ≤ 4 THEN CAR L ELSE 4-N)
					CAT SUBSTR(CAR X, 2, 'ALL)), CADR X>,
				IF CAR L + N ≤ 4 THEN CDR L
				ELSE CAR L + N - 4 CONS CDR L,
				CAR L + N)
		ELSE IF CAR L ≤ 4 THEN
			?&CARS(<AT("C" CAT SUBSTR("ADDD", 1, CAR L) CAT "R"), X>,
				CDR L, CAR L)
		ELSE ?&CARS(<'CDDDDR, X>, (CAR L - 4) CONS CDR L, 4)
	ELSE ?&CARS(<'CAR, <'SUFLIST, X,
			IF NOT ATOM CAR(L) AND CAAR L EQ 'ADD1 THEN CADAR L
			ELSE <'SUB1, CAR L>>>,
		CDR L, 1);


END.